# -*- coding: utf-8 -*-
import os
import sys
import threading
from PyQt5 import QtCore
from PyQt5.QtWidgets import QPushButton, QApplication, QMainWindow
from bypy import ByPy
from zhu import Ui_zhu
from deng import Ui_deng_lu
from tian import Ui_tian_jia
from chaKan import Ui_cha_kan
from chaZhao import Ui_cha_zhao

#   初始化各窗口
class 主Ui(QMainWindow, Ui_zhu):
    def __init__(self):
        super(主Ui, self).__init__()
        self.setupUi(self)
        self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)

class 登录Ui(QMainWindow, Ui_deng_lu):
    def __init__(self):
        super(登录Ui, self).__init__()
        self.setupUi(self)
        # 这个是使用最小按钮
        self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)

class 添加Ui(QMainWindow, Ui_tian_jia):
    def __init__(self):
        super(添加Ui, self).__init__()
        self.setupUi(self)
        self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)

class 查看Ui(QMainWindow, Ui_cha_kan):
    def __init__(self):
        super(查看Ui, self).__init__()
        self.setupUi(self)
        self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)

class 查找Ui(QMainWindow, Ui_cha_zhao):
    def __init__(self):
        super(查找Ui, self).__init__()
        self.setupUi(self)
        self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)

class 运行(QPushButton, QApplication, QMainWindow):

    def __init__(self):
        self.会员信息名 = '子时会员信息.txt'
        self.会员记录名 = '子时会员记录.txt'
        self.新版软件名 = 'main.txt'
        self.新版本信息 = '子时结算系统版本信息.txt'
        self.现版本信息 = '1.0'
        self.更新程序名 = 'upgrade.exe'
        #   初始化百度API包
        self.bp = ByPy()
        #   初始化窗口
        app = QApplication(sys.argv)
        self.登录窗口 = 登录Ui()
        self.主窗口 = 主Ui()
        self.查找窗口 = 查找Ui()
        self.查看窗口 = 查看Ui()
        self.添加窗口 = 添加Ui()
        self.登录窗口.show()  # 默认窗口
        self.下载线程()
        self.窗口按钮()

        sys.exit(app.exec_())

    def 窗口按钮(self):
        #   初始化界面跳转按钮
        self.主窗口.pushButton_qie_huan_zhu.clicked.connect(
            lambda: {self.主窗口.close(), self.登录窗口.show(), self.打开文件()}
        )
        self.主窗口.pushButton_cha_kan_zhu.clicked.connect(
        	lambda:{self.主窗口.close(), self.查看窗口.show(), self.查看会员()}
        )
        self.主窗口.pushButton_cha_zhao_zhu.clicked.connect(
            lambda: {self.主窗口.close(), self.查找窗口.show(), self.清除()}
        )
        self.主窗口.pushButton_tian_jia_zhu.clicked.connect(
            lambda: {self.主窗口.close(), self.添加窗口.show(), self.清除()}
        )
        self.查看窗口.pushButton_fan_hui_kan.clicked.connect(
            lambda: {self.查看窗口.close(), self.主窗口.show()}
        )
        self.查找窗口.pushButton_fan_hui_zhao.clicked.connect(
            lambda: {self.查找窗口.close(), self.主窗口.show(), self.清除()}
        )
        self.查找窗口.pushButton_tian_jia_zhao.clicked.connect(
            lambda: {self.查找窗口.close(), self.添加窗口.show(), self.清除()}
        )
        self.添加窗口.pushButton_fan_hui_cz_tian.clicked.connect(
            lambda: {self.添加窗口.close(), self.查找窗口.show(), self.清除()}
        )
        self.添加窗口.pushButton_fan_hui_zhu_tian.clicked.connect(
            lambda: {self.添加窗口.close(), self.主窗口.show(), self.清除()}
        )

        #   登录按钮
        self.登录窗口.pushButton_deng_lu.clicked.connect(
            lambda: {self.帐号校对()}
        )
        #   刷新按钮
        self.登录窗口.pushButton_shua_xin.clicked.connect(
            lambda: {self.下载文件()}
        )
        #   添加会员
        self.添加窗口.pushButton_que_ding_tian.clicked.connect(
            lambda: {self.添加会员()}
        )
        #   查找会员
        self.查找窗口.pushButton_cha_zhao.clicked.connect(
            lambda: {self.查找会员()}
        )
        #   退出程序并上传删除文件
        self.主窗口.pushButton.clicked.connect(
            lambda: {self.主窗口.close(), self.上传文件()}
        )
        #   未操作退出并删除文件
        self.登录窗口.pushButton_tui_chu.clicked.connect(
            lambda: {self.登录窗口.close(), self.上传文件()}
        )

    def 下载线程(self):
        # 创建一个新线程
        self.th = threading.Thread(target=self.下载文件)
        # 设置线程为守护线程，防止退出主线程时，子线程仍在运行
        self.th.setDaemon(True)
        # 新线程启动
        self.th.start()

    def 下载文件(self):
        print('正在联网！')
        self.result = '正在联网！'
        self.登录窗口.label_ti_shi_2.setText(str(self.result))
        self.bp.download(remotepath=f'zishi/{self.会员信息名}')
        self.bp.download(remotepath=f'zishi/{self.会员记录名}')
        print('联网成功！')
        self.result = '联网成功！'
        self.登录窗口.label_ti_shi_2.setText(str(self.result))
        self.打开文件()

    def 打开文件(self):
        if os.path.exists(self.会员信息名):  # 如果文件存在
            with open(self.会员信息名, encoding='utf8') as f:
                self.会员信息 = f.read()
            print('加载会员信息成功！')
            self.result = '加载会员信息成功！'
            try:
                while type(self.会员信息) != dict:
                    #   文本转换成字典
                    self.会员信息 = eval(self.会员信息)
                    print('信息加载成功！')
                self.会员 = self.会员信息['会员']
                self.互转 = self.会员信息['互转']
                self.互转 = list(map(float, self.互转))
                self.result = '信息加载成功！'
            except:
                print('信息加载失败！')
                self.result = '信息加载失败！请刷新一下！'
            # self.登录窗口.label_ti_shi_2.setText(str(self.result))

        if os.path.exists(self.会员记录名):
            with open(self.会员记录名, encoding='utf8') as f:
                self.会员记录 = f.read()
            print('加载会员记录成功！')
            # self.result = '加载会员记录成功！'
        self.登录窗口.label_ti_shi_2.setText(str(self.result))

    def 保存文件(self):
        while type(self.会员信息) != dict:
            self.会员信息 = eval(self.会员信息)
        self.会员信息['会员'] = self.会员
        self.会员信息['互转'] = self.互转
        print('保存时转换字典成功')
        #   字典转换成文本
        while type(self.会员信息) != str:
            self.会员信息 = str(self.会员信息)
        print('转换文本成功')
        with open(self.会员信息名, 'w', encoding='utf8') as f:
            f.write(self.会员信息)
        with open(self.会员记录名, 'w', encoding='utf8') as f:
            f.write(self.会员记录)
        print('文件保存成功')
        self.result = '文件保存成功'

    def 上传文件(self):
        #   上传会员信息：
        #   localpath:本地的目录，如果省略则为当前目录。
        #   remotepath:云盘目录
        #   ondup:当出现重复文件时如何处理，默认是overwrite(覆盖）,安全起见可以更改为newcopy（新建）
        if os.path.exists(self.会员信息名):  # 如果文件存在
            self.bp.upload(self.会员信息名, remotepath='zishi', ondup='overwrite')
        if os.path.exists(self.会员记录名):
            self.bp.upload(self.会员记录名, remotepath='zishi', ondup='overwrite')
        self.删除文件()

    def 删除文件(self):
        if os.path.exists(self.会员信息名):  # 如果文件存在
            os.remove(self.会员信息名)
        if os.path.exists(self.会员记录名):
            os.remove(self.会员记录名)
        self.更新()

    def 更新(self):
        old = self.现版本信息
        self.bp.download(remotepath=f'zishi/{self.新版本信息}')
        if os.path.exists(self.新版本信息):  # 如果文件存在
            with open(self.新版本信息, encoding='utf8') as f:
                new = f.read()
            os.remove(self.新版本信息)
            if new > old:
                self.bp.download(remotepath=f'zishi/{self.新版软件名}')
        if os.path.exists(self.更新程序名):
            os.popen(self.更新程序名)
        else:
            self.bp.download(remotepath=f'zishi/{self.更新程序名}')
            os.popen(self.更新程序名)

    '''
        会员信息内容格式(字典类型)：{
        子时:密码,双安:密码,酒吧:密码,
        会员:{手机号:[0姓名,1子时充值,2双安充值,3酒吧充值,4子时消费,5双安消费,6酒吧消费,7累计充值,8累计消费]}
        互转:[0子时转双安,1子时转酒吧,2双安转子时,3双安转酒吧,4酒吧转子时,5酒吧转双安]
        }
    '''

    def 清除(self):
        self.result = ""
        self.result1 = ""
        self.添加窗口.label_xian_shi_tian.setText(str(self.result))
        self.添加窗口.textBrowser_xian_shi_tian.setText(str(self.result1))
        self.查找窗口.label_ti_shi_zhao.setText(str(self.result))
        self.查找窗口.textBrowser_xian_shi.setText(str(self.result1))

    def 本店数据分配(self):
        #   根据店面变换存储位置
        #   0姓名,1子时充值,2双安充值,3酒吧充值,4子时消费,5双安消费,6酒吧消费,7累计充值,8累计消费
        #   0子时转双安,1子时转酒吧,2双安转子时,3双安转酒吧,4酒吧转子时,5酒吧转双安
        if self.帐号 == '子时':
            #   充值消费位置
            self.充值, self.消费 = 1, 4
            #   互转位置
            self.转入本店, self.本店转出 = \
                self.互转[2] + self.互转[4], self.互转[0] + self.互转[1]

        elif self.帐号 == '泰丰宇':
            self.充值, self.消费 = 2, 5

            self.转入本店, self.本店转出 = \
                self.互转[0] + self.互转[5], self.互转[2] + self.互转[3]

        elif self.帐号 == '酒吧':
            self.充值, self.消费 = 3, 6

            self.转入本店, self.本店转出 = \
                self.互转[1] + self.互转[3], self.互转[4] + self.互转[5]

        elif self.帐号 == 'zyn1233':
            pass

    def 待转分配(self):
        #   0姓名,1子时充值,2双安充值,3酒吧充值,4子时消费,5双安消费,6酒吧消费,7累计充值,8累计消费
        #   0子时转双安,1子时转酒吧,2双安转子时,3双安转酒吧,4酒吧转子时,5酒吧转双安
        self.待转 = round((self.本店消费 - self.本店充值), 2)
        self.本店消费 = self.本店充值
        子时余额 = self.l[1] - self.l[4]
        双安余额 = self.l[2] - self.l[5]
        酒吧余额 = self.l[3] - self.l[6]
        if self.帐号 == '子时':
            if 酒吧余额 >= self.待转:
                self.l[6] += self.待转
                self.互转[1] += self.待转
            elif 双安余额 >= self.待转:
                self.l[5] += self.待转
                self.互转[0] += self.待转
            elif (酒吧余额 + 双安余额) >= self.待转:
                self.l[6] += 酒吧余额
                self.l[5] += (self.待转 - 酒吧余额)
                self.互转[1] += 酒吧余额
                self.互转[0] += (self.待转 - 酒吧余额)

        #   0姓名,1子时充值,2双安充值,3酒吧充值,4子时消费,5双安消费,6酒吧消费,7累计充值,8累计消费
        #   0子时转双安,1子时转酒吧,2双安转子时,3双安转酒吧,4酒吧转子时,5酒吧转双安
        elif self.帐号 == '泰丰宇':
            if 子时余额 >= self.待转:
                self.l[4] += self.待转
                self.互转[2] += self.待转
            elif 酒吧余额 >= self.待转:
                self.l[6] += self.待转
                self.互转[3] += self.待转
            elif (酒吧余额 + 子时余额) >= self.待转:
                self.l[4] += 子时余额
                self.l[6] += (self.待转 - 子时余额)
                self.互转[2] += 子时余额
                self.互转[3] += (self.待转 - 子时余额)

        #   0姓名,1子时充值,2双安充值,3酒吧充值,4子时消费,5双安消费,6酒吧消费,7累计充值,8累计消费
        #   0子时转双安,1子时转酒吧,2双安转子时,3双安转酒吧,4酒吧转子时,5酒吧转双安
        elif self.帐号 == '酒吧':
            if 子时余额 >= self.待转:
                self.l[4] += self.待转
                self.互转[4] += self.待转
            elif 双安余额 >= self.待转:
                self.l[5] += self.待转
                self.互转[5] += self.待转
            elif (双安余额 + 子时余额) >= self.待转:
                self.l[4] += 子时余额
                self.l[5] += (self.待转 - 子时余额)
                self.互转[4] += 子时余额
                self.互转[5] += (self.待转 - 子时余额)

        elif self.帐号 == 'zyn1233':
            pass

    def 提取(self):
        self.l[1:] = list(map(float, self.l[1:]))   # 从位置1开始后面转换成小数

        self.姓名, self.本店充值, self.本店消费, self.累计充值, self.累计消费 = \
            self.l[0], self.l[self.充值], self.l[self.消费], self.l[7], self.l[8]

    def 计算(self):
        #   输入字符串转数字
        self.本次充值, self.本次消费 = \
            float(self.本次充值), round(float(self.本次消费) * 0.85)

        self.本店充值, self.本店消费 = \
            self.本店充值 + self.本次充值, self.本店消费 + self.本次消费

        self.累计充值, self.累计消费 = \
            self.累计充值 + self.本次充值, self.累计消费 + self.本次消费

    def 存入(self):
        self.l[0], self.l[self.充值], self.l[self.消费], \
        self.l[7], self.l[8] = \
            self.姓名, round(self.本店充值, 2), round(self.本店消费, 2), \
            round(self.累计充值, 2), round(self.累计消费, 2)

    def 输出(self):
        self.result1 = (f'会员：{self.手机号}\n'
                        f'姓名：{self.姓名}，总余额: {(self.累计充值-self.累计消费):.2f}元\n'
                        f'本店充值:{self.本店充值}元，本店消费:{self.本店消费}元，本店余额：{(self.本店充值-self.本店消费):.2f}元\n'
                        f'累计充值{self.累计充值}元，累计消费{self.累计消费}元\n\n')

    def 帐号校对(self):
        if os.path.exists(self.会员信息名):
            self.帐号 = self.登录窗口.lineEdit_zhang_hao_shu_ru.text()
            密码 = self.登录窗口.lineEdit_mi_ma_shu_ru.text()
            if self.帐号 == '':
                提示 = '输入不能为空！！！'
            elif self.帐号 in self.会员信息:
                mm = self.会员信息[self.帐号]
                if 密码 == mm:
                    return self.登录窗口.close(), self.主窗口.show()
                else:
                    提示 = '密码错误！！！'
            else:
                提示 = '帐号错误！！！'
        else:
            提示 = '等待联网！！！'
        self.登录窗口.label_ti_shi.setText(str(提示))

    def 添加会员(self):
        # 初始化信息框
        self.手机号 = self.添加窗口.lineEdit_shou_ji_hao_ru.text()
        self.姓名 = self.添加窗口.lineEdit_xing_ming_ru.text()
        self.本次充值 = self.添加窗口.lineEdit_chong_zhi_ru.text()
        self.本次消费 = self.添加窗口.lineEdit_xiao_fei_ru.text()
        self.l = [f'{self.姓名}', 0, 0, 0, 0, 0, 0, 0, 0]
        if self.手机号.isdigit():
            if len(self.手机号) == 11:
                if self.姓名:
                    if self.手机号 not in self.会员:
                        if self.本次充值.isdigit() and self.本次消费.isdigit():
                            self.本店数据分配()     # 提取数据的地址
                            self.提取()
                            self.计算()
                            余额 = self.本次充值 - self.本次消费
                            if 余额 >= 0:
                                #   保存数据
                                self.存入()
                                self.输出()
                                self.会员[self.手机号] = self.l
                                self.保存文件()
                                self.添加窗口.textBrowser_xian_shi_tian.setText(str(self.result1))
                            else:
                                self.result = "余额不足！！！"
                        else:
                            self.result = "金额输入错误！请输入整数！"
                    else:
                        self.result = '已有此会员！！！'
                else:
                    self.result = "请输入姓名！！！"
            else:
                self.result = "手机号位数输入错误！！！"
        else:
            self.result = "输入的不是手机号！！！"
        self.添加窗口.label_xian_shi_tian.setText(str(self.result))

    def 查看会员(self):
        #   初始化排版的字符串
        self.本店数据分配()
        nmb, T1 = 0, ''
        会员数 = f'目前共有{len(self.会员)}位会员。'
        self.查看窗口.label.setText(str(会员数))
        result = f'本店在它店消费{self.本店转出:.2f}元，它店在本店消费{self.转入本店:.2f}元'
        self.查看窗口.label_2.setText(str(result))
        for self.手机号 in self.会员:
            nmb += 1
            T1 += f'{nmb}、'
            self.l = self.会员[self.手机号]
            self.提取()
            self.输出()
            T1 += self.result1
        self.查看窗口.textBrowser_xian_shi_kan.setText(str(T1))

    def 查找会员(self):
        查找号 = self.查找窗口.lineEdit_shu_ru_zhao.text()
        di = {}    # 初始化一个字典，不然会报错！！！
        if len(self.会员) > 0:
            if 查找号.isdigit():  # 检查是否是数字
                for i in self.会员:  # 遍历会员信息
                    if 查找号 in i[11 - len(查找号):]:  # 电话后几位相同
                        di[i] = self.会员[i]
                        self.手机号 = i
                if di:
                    if len(di) == 1:
                        self.l = self.会员[self.手机号]
                        self.提取()
                        self.输出()
                        self.查找窗口.textBrowser_xian_shi.setText(str(self.result1))
                        self.result = '查找完成！'
                        self.保存状态 = False  # False是未保存，True是已保存
                        print('会员信息类型是', type(self.会员信息))
                        #   充值消费按钮
                        self.查找窗口.pushButton_bao_cun_zhao.clicked.connect(
                            lambda: {self.充值消费()}
                        )
                    else:
                        self.result1 = ''
                        self.result = '搜索到多个会员，多输入几位以便精确查找!'
                else:
                    self.result1 = ''
                    self.result = '无此会员！'
            else:
                self.result1 = ''
                self.result = '请输入电话号码!'
        else:
            self.result1 = ''
            self.result = '目前没有会员！'
        self.查找窗口.label_ti_shi_zhao.setText(str(self.result))

    def 充值消费(self):
        print(self.保存状态)
        if self.保存状态 == False:
            self.本次充值 = self.查找窗口.lineEdit_chong_zhao.text()
            self.本次消费 = self.查找窗口.lineEdit_xiao_zhao.text()
            if self.本次充值.isdigit() and self.本次消费.isdigit():
                self.计算()
                if (self.累计充值-self.累计消费) >= 0:
                    #   本店余额充足时扣本店的
                    if self.本店充值 >= self.本店消费:   # 检查本店余额
                        self.存入()
                        self.输出()
                        self.会员[self.手机号] = self.l
                        self.保存文件()
                        self.保存状态 = True

                    #   本店余额不足时扣除其它店的
                    else:
                        self.待转分配()
                        self.存入()
                        self.输出()
                        self.会员[self.手机号] = self.l
                        self.保存文件()
                        self.保存状态 = True
                    self.查找窗口.textBrowser_xian_shi.setText(str(self.result1))
                else:
                    self.result = '余额不足！！！'
            else:
                self.result = '请输入整数！！！'
        else:
            self.result = '已经保存过了！！！'
        self.查找窗口.label_ti_shi_zhao.setText(str(self.result))

if __name__ == '__main__':
    运行()